package com.ss.pj.sc06;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;

@SpringBootApplication
@EnableDiscoveryClient
public class Sc06RibbonApplication {
	/**
	 * 创建 RestTemplate 实例
	 * RestTemplate 是用来调用其他微服务的工具类，封装了远程调用代码，
	 * 提供了一组用于远程调用的模板方法，
	 * 例如：getForObject()、postForObject() 等
	 * 		@LoadBalanced
	 * 		开启负载均衡, 会对 RestTemplate 实例进行封装，
	 * 		创建动态代理对象，并切入（AOP）负载均衡代码，
	 * 		把请求分散分发到集群中的服务器 (轮换形式)
	 * @return
	 */
	@Bean
	@LoadBalanced
	public RestTemplate getRestTemplate(){
		// 在主程序中通过工厂模式设置超时属性
		SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
		factory.setConnectTimeout(1000);// 连接超时
		factory.setReadTimeout(1000);// 读取超时
		// 注意, RestTemplate 中默认的 Factory 实例中，两个超时属性默认是 -1，即: 未启用超时，也不会触发重试
		return new RestTemplate(factory);
	}

	public static void main(String[] args) {
		SpringApplication.run(Sc06RibbonApplication.class, args);
	}

}
